package com.leenmvc.core.dao.communal;


import java.util.List;
import java.util.Map;

public interface BaseDao {

    /**
     * 获取分页
     *
     * @param wrapper
     * @param <T>
     * @return
     */
    <T> List<T> getPageList(Wrapper wrapper);

    /**
     * 根据ID 删除
     *
     * @param id
     * @param cls
     *
     */
    boolean deleteById(Class<?> cls, Object id);

    /**
     * 根据字段，字段值键值对删除
     * @param cls
     * @param kvs
     * @return
     */
    int delete(Class<?> cls, Object...kvs);

    /**
     * 批量删除
     *
     * @param cls
     * @param ids
     */
    int deleteByIds(Class<?> cls, Object[] ids);

    /**
     * 根据实体进行删除
     */
    <T> boolean remove(T cls);

    /**
     * 批量删除
     *
     * @param list 批量删除
     * @param <T>
     * @return
     */
    <T> int batchRemove(List<T> list);

    /**
     * 通过ID查询
     *
     * @param id
     * @param cls
     * @param <T>
     * @return
     */
    <T> T get(Class<?> cls, Object id);

    /**
     * 根据键值对获取一个记录
     *
     * @param cls
     * @param kvs
     * @param <T>
     * @return
     */
    <T> T get(Class<?> cls, Object...kvs);

    /**
     * 根据键值对获取一个记录列表
     * @param <T>
     * @return
     */
    <T> List<T> getList(Class<?> cls, Object...kvs);


    /**
     * 根据map获取一个记录列表
     * @param <T>
     * @return
     */
    <T> List<T> getList(Class<?> cls, Map<String,Object> params);
    /**
     * 根据条件获取一个实体
     *
     * @param cls
     * @param params
     * @param <T>
     * @return
     */
    <T> T get(Class<?> cls, Map<String, Object> params);
    /**
     * 分页获取
     *
     * @param pageInfo
     * @param cls
     * @param <T>
     * @return
     */
    <T> List<T> getPageList(Class<?> cls, Integer... pageInfo);

    /**
     * 根据条件返回分页内容
     *
     * @param cls
     * @param conditions
     * @param pageInfo
     * @param <T>
     * @return
     */
    <T> List<T> getPageList(Class<?> cls, Map<String, Object> conditions, Integer... pageInfo);

    /**
     * 查询所有的数据
     *
     * @param cls
     * @param <T>
     * @return
     */
    <T> List<T> getAll(Class<?> cls);

    /**
     * 自定义sql语句查询
     *
     * @param cls
     * @param sql
     * @param objects
     * @param <T>
     * @return
     */
    <T> List<T> query(Class<?> cls, String sql, Object... objects);

    /**
     * 根据sql语句获取map
     *
     * @param sql
     * @param objects
     * @return
     */
    Map<String, Object> getMap(Class<?> cls, String sql, Object... objects);

    /**
     * 根据sql语句获取List<map>
     *
     * @param sql
     * @param objects
     * @return
     */
    List<Map<String, Object>> getListMap(Class<?> cls, String sql, Object... objects);
    /**
     * 保存
     *
     * @param t
     * @param <T>
     */
    <T> boolean insert(T t);

    /**
     * 添加一条记录， map
     *
     * @param entityMap
     */
    <T> boolean insert(Class<?> cls, Map<String, Object> entityMap);

    /**
     *
     * 批量插入方法
     *
     * @param t
     * @param <T>
     */
    <T> boolean batchInsert(List<T> t);

    /**
     * 更新添加二合一
     *
     * @param t
     * @param <T>
     * @return
     */
    <T> boolean saveOrUpdate(T t);

    /**
     * 批量插入方法
     *
     * @param ts
     * @param <T>
     */
    <T> boolean batchInsert(T[] ts);
    /**
     * 更新方法
     *
     * @param t
     * @param <T>
     */
    <T> boolean update(T t);

    /**
     * 更新方法
     *
     * @param cls 实体类
     * @param id 实体ID
     * @param kv 键值对
     * @param <T>
     */
    <T> boolean update(Class<?> cls, Object id, Object... kv);
    /**
     * 更新方法
     *
     * @param params
     * @param cls
     * @param <T>
     */
    <T> int update(Class<?> cls, Map<String, Object> params);

    /**
     * 根据条件返回数量
     *
     * @param cls
     * @param params
     * @return
     */
    int count(Class<?> cls, Map<String, Object> params);

    /**
     * 根据条件返回数量
     *
     * @param cls
     * @return
     */
    int count(Class<?> cls, Object... kvs);

    /**
     * 总量
     *
     * @param cls
     * @return
     */
    int count(Class<?> cls);

    /**
     * 根据queryWrapper查找数量
     *
     * @return
     */
    int count(Wrapper wrapper);
    /**
     * 根据queryWrapper对象查询列表
     *
     * @param <T>
     * @return
     */
    <T> List<T> query(Wrapper wrapper);

    /**
     * 根据queryWrapper对象查询对象
     *
     * @param wrapper
     * @param <T>
     * @return
     */
    <T> T get(Wrapper wrapper);

    <T> T getOneField(Wrapper queryWrapper);

    /**
     * 根据queryWrapper对象查询对象列表
     *
     * @param queryWrapper
     * @param <T>
     * @return
     */
    <T> List<T> oneFieldList(Wrapper queryWrapper);

    /**
     * 根据queryWrapper获取map
     *
     * @param wrapper
     * @return
     */
    Map<String, Object> getMap(Wrapper wrapper);

    /**
     * 根据queryWrapper获取listmap
     *
     * @param wrapper
     * @return
     */
    List<Map<String, Object>> getListMap(Wrapper wrapper);

    /**
     * 根据queryWrapper删除
     *
     * @param wrapper
     * @return
     */
    int delByWrapper(Wrapper wrapper);

    /**
     * 根据queryWrapper更新
     *
     * @param wrapper
     * @return
     */
    int updateByWrapper(Wrapper wrapper);

    /**
     * 根据sqlkey获取实体
     *
     * @param cls 实体类
     * @param batisKey sqlkey
     * @param params 参数
     * @param <T>
     * @return
     */
    <T> List<T> listBySqlKey(Class<?> cls, String batisKey, Map<String, Object> params);


    /**
     * 根据sqlkey获取实体列表
     *
     * @param cls 实体类
     * @param id sqlkey
     * @param params 参数
     * @param <T>
     * @return
     */
    <T> T getBySqlKey(Class<?> cls, String id, Map<String, Object> params);

    /**
     * 根据sqlkey获取实体
     *
     * @param cls 实体类
     * @param batisKey sqlkey
     * @param params 参数
     * @param <T>
     * @return
     */
    <T> List<T> listBySqlKey(Class<?> cls, String batisKey, Object params);


    /**
     * 根据sqlkey获取实体列表
     *
     * @param cls 实体类
     * @param id sqlkey
     * @param params 参数
     * @param <T>
     * @return
     */
    <T> T getBySqlKey(Class<?> cls, String id, Object params);


    /**
     * 根据sqlkey获取实体
     *
     * @param cls 实体类
     * @param batisKey sqlkey
     * @param KVs 参数
     * @param <T>
     * @return
     */
    <T> List<T> listBySqlKey(Class<?> cls, String batisKey, Object...KVs);


    /**
     * 根据sqlkey获取实体列表
     *
     * @param cls 实体类
     * @param id sqlkey
     * @param KVs 参数
     * @param <T>
     * @return
     */
    <T> T getBySqlKey(Class<?> cls, String id, Object...KVs);

}
